package com.baizhi.cmfz.util;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import javax.servlet.ServletOutputStream;

import java.io.IOException;

import java.lang.reflect.Field;
import java.util.List;

public class FileExportUtils {
	/**
	 *该方法会将传入的集合输出的数据默认的放到系统环境下的 E 盘根目录,
	 * 文件名和工作表的名称由参数指定
	 *
	 * @param t 要写入文件的集合数据,需要一个list集合
	 * @param tableName 创建的工作表名称
	 * @param fileName 创建的表格的名称
	 * @param  title 写入数据的时候指定的表格的列名,参数是一个字符串数组
	 * @param <T> 集合的泛型
	 */
	public static  <T> void testClass(List<T> t, String tableName, String fileName, String[] title, ServletOutputStream out) throws IllegalAccessException, IOException {
		System.out.println(t);
//		将list集合的数据写入excel中

//		创建表格对象
		HSSFWorkbook workbook = new HSSFWorkbook();
//		创建工作表
		HSSFSheet sheet = workbook.createSheet(tableName);

//		创建表格头信息的行对象
		HSSFRow row = sheet.createRow(0);
		for(int i = 0;i < title.length;i++){
//			创建单元格对象
			HSSFCell cell = row.createCell(i);
//			写入单元格
			cell.setCellValue(title[i]);
		}

//		创建表格内容的行对象
//		遍历list集合
		for(int i = 0;i < t.size();i++){
			HSSFRow sheetRow = sheet.createRow(i+1);
//			拿到当前元素的对象
			T t1 = t.get(i);
//			获取 t1 中的所有属性对象
			Field[] fields = t1.getClass().getDeclaredFields();
//			遍历
			for(int j = 0;j < fields.length;j++){
//				创建单元格对象
				HSSFCell cell = sheetRow.createCell(j);
//				获取原来属性的访问控制权限,私有属性的控制权限为false;
				boolean b = fields[j].isAccessible();
				System.out.println("私有属性的控制权限"+b);
//				修改访问控制权限,修改为true可以得到属性的值
				fields[j].setAccessible(true);
//				获取当前属性对应的值
				Object o = fields[j].get(t1);
//				将这个值写入单元格
//				如果是空值,那么会在单元格中写入一个空的字符串
				if(o==null){
					cell.setCellValue("");
				}else{
					cell.setCellValue(o.toString());
				}
//				恢复属性的控制权限,为了安全重置为false;
				fields[j].setAccessible(b);
			}
		}
		workbook.write(out);
	}
}
